package com.momo.mal.util;

import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.net.MalformedURLException;
import java.util.HashMap;
import java.util.Map;

import org.apache.http.HttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;

import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.os.Environment;
import android.os.Handler;
import android.os.Message;
import android.util.Log;
import android.widget.ImageView;

public class DrawableManager {
    private final Map<String, Drawable> drawableMap;
    private final Map<String, Bitmap> bitmapMap;
    private Context context;

    public DrawableManager(Context context) {
        this.drawableMap = new HashMap<String, Drawable>();
        this.bitmapMap = new HashMap<String, Bitmap>();
        this.context = context;
    }

    private Drawable fetchDrawable(String urlString) {
        if (drawableMap.containsKey(urlString)) {
            return drawableMap.get(urlString);
        }

//        Log.d(this.getClass().getSimpleName(), "image url:" + urlString);
        try {
            InputStream is = fetch(urlString);
            Drawable drawable = Drawable.createFromStream(is, "src");


            if (drawable != null) {
                drawableMap.put(urlString, drawable);
//                Log.d(this.getClass().getSimpleName(), "got a thumbnail drawable: " + drawable.getBounds() + ", "
//                        + drawable.getIntrinsicHeight() + "," + drawable.getIntrinsicWidth() + ", "
//                        + drawable.getMinimumHeight() + "," + drawable.getMinimumWidth());
            } else {
              Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
            }

            return drawable;
        } catch (MalformedURLException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        } catch (IOException e) {
            Log.e(this.getClass().getSimpleName(), "fetchDrawable failed", e);
            return null;
        }
    }
    
    private Bitmap fetchBitmap(String id) {
        if (bitmapMap.containsKey(id)) {
            return bitmapMap.get(id);
        }

        String state = Environment.getExternalStorageState();
		File mediaStorageDir = null;
		
		if (Environment.MEDIA_MOUNTED.equals(state)) {
		    mediaStorageDir = new File(context.getExternalCacheDir(), "");
		} else if (Environment.MEDIA_MOUNTED_READ_ONLY.equals(state)) {
			mediaStorageDir = new File(context.getCacheDir(), "");
		} else {
		    mediaStorageDir = new File(context.getCacheDir(), "");
		}
		
		File mediaFile = new File(mediaStorageDir.getPath() + File.separator + id);
		Bitmap bitmap = BitmapFactory.decodeFile(mediaFile.getAbsolutePath());

        if (bitmap != null) {
        	bitmapMap.put(id, bitmap);
        } else {
            Log.w(this.getClass().getSimpleName(), "could not get thumbnail");
        }

        return bitmap;
    }
    
    public void fetchBitmapOnThread(final String id, final ImageView imageView) {
        if (drawableMap.containsKey(id)) {
            imageView.setImageDrawable(drawableMap.get(id));
        }

        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message message) {
//                imageView.setImageDrawable((Drawable) message.obj);
            	imageView.setImageBitmap((Bitmap) message.obj);
            }
        };

        Thread thread = new Thread() {
            @Override
            public void run() {
                //TODO : set imageView to a "pending" image
                Bitmap bitmap = fetchBitmap(id);
                Message message = handler.obtainMessage(1, bitmap);
                handler.sendMessage(message);
            }
        };
        thread.start();
    }

    public void fetchDrawableOnThread(final String urlString, final ImageView imageView) {
        if (drawableMap.containsKey(urlString)) {
            imageView.setImageDrawable(drawableMap.get(urlString));
        }

        final Handler handler = new Handler() {
            @Override
            public void handleMessage(Message message) {
                imageView.setImageDrawable((Drawable) message.obj);
            }
        };

        Thread thread = new Thread() {
            @Override
            public void run() {
                //TODO : set imageView to a "pending" image
                Drawable drawable = fetchDrawable(urlString);
                Message message = handler.obtainMessage(1, drawable);
                handler.sendMessage(message);
            }
        };
        thread.start();
    }

    private InputStream fetch(String urlString) throws MalformedURLException, IOException {
        DefaultHttpClient httpClient = new DefaultHttpClient();
        HttpGet request = new HttpGet(urlString);
        HttpResponse response = httpClient.execute(request);
        return response.getEntity().getContent();
    }
}
